/* Offsets in shared_info_t */
EVENTS = 0
-EVENTS_ENABLE = 4
+EVENTS_MASK = 4
/* Offsets in guest_trap_bounce */
GTB_ERROR_CODE = 0
jnz process_hyp_events
/*test_guest_events:*/
movl SHARED_INFO(%ebx),%eax
- test %ecx,EVENTS(%eax)
- jz restore_all
- test %ecx,EVENTS_ENABLE(%eax)
- jz restore_all
- /* Prevent unnecessary reentry of event callback (stack overflow!) */
- xorl %ecx,%ecx
- movl %ecx,EVENTS_ENABLE(%eax)
+ shl $31,%ecx # %ecx = EVENTS_MASTER_ENABLE_MASK
+ test %ecx,EVENTS_MASK(%eax)
+ jz restore_all # only notify if master switch enabled
+ movl EVENTS(%eax),%ecx
+ andl EVENTS_MASK(%eax),%ecx
+ jz restore_all # skip if no events to deliver
+ notl %ecx
+ btrl $31,%ecx # NB. We clear all events that are
+ andl %ecx,EVENTS_MASK(%eax) # being delivered + master enable.
/*process_guest_events:*/
mov PROCESSOR(%ebx),%edx
shl $4,%edx # sizeof(guest_trap_bounce) == 16
task_states[p->state], p->hyp_events);
s = p->shared_info;
if(!is_idle_task(p)) {
- printk("Guest: events = %08lx, event_enable = %08lx\n",
- s->events, s->events_enable);
+ printk("Guest: events = %08lx, events_mask = %08lx\n",
+ s->events, s->events_mask);
printk("Notifying guest...\n");
set_bit(_EVENT_DEBUG, &s->events);
}
#define PGEXT_CMD_SHIFT 8
+/*
+ * Master "switch" for enabling/disabling event delivery.
+ */
+#define EVENTS_MASTER_ENABLE_MASK 0x80000000UL
+#define EVENTS_MASTER_ENABLE_BIT 31
+
+
#ifndef __ASSEMBLY__
#include "network.h"
/* Bitmask of outstanding event notifications hypervisor -> guest OS. */
unsigned long events;
/*
- * Hypervisor will only signal event delivery via the "callback
- * exception" when this value is non-zero. Hypervisor clears this when
- * notiying the guest OS -- this prevents unbounded reentrancy and
- * stack overflow (in this way, acts as an interrupt-enable flag).
+ * Hypervisor will only signal event delivery via the "callback exception"
+ * when a pending event is not masked. The mask also contains a "master
+ * enable" which prevents any event delivery. This mask can be used to
+ * prevent unbounded reentrancy and stack overflow (in this way, acts as a
+ * kind of interrupt-enable flag).
*/
- unsigned long events_enable;
+ unsigned long events_mask;
/*
* Time: The following abstractions are exposed: System Time, Clock Time,
fi
endmenu
+
+source lib/Config.in
\ No newline at end of file
CONFIG_BLK_DEV_NBD=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
-# CONFIG_BLK_DEV_INITRD is not set
+CONFIG_BLK_DEV_INITRD=y
CONFIG_XENOLINUX_BLOCK=y
#
# CONFIG_FAT_FS is not set
# CONFIG_CRAMFS is not set
# CONFIG_TMPFS is not set
-# CONFIG_RAMFS is not set
+CONFIG_RAMFS=y
CONFIG_ISO9660_FS=y
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
+CONFIG_ZISOFS_FS=y
# CONFIG_MINIX_FS is not set
# CONFIG_VXFS_FS is not set
# CONFIG_NTFS_FS is not set
# CONFIG_UDF_FS is not set
# CONFIG_UFS_FS is not set
+# Skanky NLS stuff
+CONFIG_NLS_DEFAULT="iso8559-1"
+CONFIG_NLS_CODEPAGE_437=n
+CONFIG_NLS_CODEPAGE_737=n
+CONFIG_NLS_CODEPAGE_775=n
+CONFIG_NLS_CODEPAGE_850=n
+CONFIG_NLS_CODEPAGE_852=n
+CONFIG_NLS_CODEPAGE_855=n
+CONFIG_NLS_CODEPAGE_857=n
+CONFIG_NLS_CODEPAGE_860=n
+CONFIG_NLS_CODEPAGE_861=n
+CONFIG_NLS_CODEPAGE_862=n
+CONFIG_NLS_CODEPAGE_863=n
+CONFIG_NLS_CODEPAGE_864=n
+CONFIG_NLS_CODEPAGE_865=n
+CONFIG_NLS_CODEPAGE_866=n
+CONFIG_NLS_CODEPAGE_869=n
+CONFIG_NLS_CODEPAGE_936=n
+CONFIG_NLS_CODEPAGE_950=n
+CONFIG_NLS_CODEPAGE_932=n
+CONFIG_NLS_CODEPAGE_949=n
+CONFIG_NLS_CODEPAGE_874=n
+CONFIG_NLS_ISO8859_8=n
+CONFIG_NLS_CODEPAGE_1250=n
+CONFIG_NLS_CODEPAGE_1251=n
+CONFIG_NLS_ISO8859_1=n
+CONFIG_NLS_ISO8859_2=n
+CONFIG_NLS_ISO8859_3=n
+CONFIG_NLS_ISO8859_4=n
+CONFIG_NLS_ISO8859_5=n
+CONFIG_NLS_ISO8859_6=n
+CONFIG_NLS_ISO8859_7=n
+CONFIG_NLS_ISO8859_9=n
+CONFIG_NLS_ISO8859_13=n
+CONFIG_NLS_ISO8859_14=n
+CONFIG_NLS_ISO8859_15=n
+CONFIG_NLS_KOI8_R=n
+CONFIG_NLS_KOI8_U=n
+CONFIG_NLS_UTF8=n
+
+
#
# Network File Systems
#
# Library routines
#
CONFIG_ZLIB_INFLATE=y
-
-
+CONFIG_ZLIB_DEFLATE=n
movl %eax,EAX(%esp) # save the return value
ENTRY(ret_from_sys_call)
movl SYMBOL_NAME(HYPERVISOR_shared_info),%esi
- xorl %eax,%eax
- movl %eax,4(%esi) # need_resched and signals atomic test
+ btrl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # make tests atomic
ret_syscall_tests:
cmpl $0,need_resched(%ebx)
jne reschedule
cmpl $0,sigpending(%ebx)
je safesti # ensure need_resched updates are seen
signal_return:
- btsl %eax,4(%esi) # reenable event callbacks
+ btsl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # reenable event callbacks
movl %esp,%eax
xorl %edx,%edx
call SYMBOL_NAME(do_signal)
ALIGN
reschedule:
- btsl %eax,4(%esi) # reenable event callbacks
- call SYMBOL_NAME(schedule) # test
+ btsl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # reenable event callbacks
+ call SYMBOL_NAME(schedule) # test
jmp ret_from_sys_call
ENTRY(divide_error)
movb CS(%esp),%cl
test $2,%cl # slow return to ring 2 or 3
jne ret_syscall_tests
-safesti:btsl %eax,4(%esi) # reenable event callbacks
+safesti:btsl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # reenable event callbacks
scrit: /**** START OF CRITICAL REGION ****/
cmpl %eax,(%esi)
jne 14f # process more events if necessary...
RESTORE_ALL
-14: btrl %eax,4(%esi)
+14: btrl $EVENTS_MASTER_ENABLE_BIT,4(%esi)
jmp 11b
ecrit: /**** END OF CRITICAL REGION ****/
# [How we do the fixup]. We want to merge the current stack frame with the
.byte 0x20 # pop %es
.byte 0x24,0x24,0x24 # add $4,%esp
.byte 0x28 # iret
- .byte 0x00,0x00,0x00,0x00 # btrl %eax,4(%esi)
+ .byte 0x00,0x00,0x00,0x00,0x00 # btrl $31,4(%esi)
.byte 0x00,0x00 # jmp 11b
# Hypervisor uses this for application faults while it executes.
do {
/* Specialised local_irq_save(). */
- flags = shared->events_enable;
- shared->events_enable = 0;
+ flags = test_and_clear_bit(EVENTS_MASTER_ENABLE_BIT,
+ &shared->events_mask);
barrier();
events = xchg(&shared->events, 0);
: "eax", "ecx", "edx", "memory" );
/* Specialised local_irq_restore(). */
- shared->events_enable = flags;
+ if ( flags ) set_bit(EVENTS_MASTER_ENABLE_BIT, &shared->events_mask);
barrier();
}
while ( shared->events );
* Define interface to generic handling in irq.c
*/
-static unsigned int startup_hypervisor_event(unsigned int irq)
-{
- set_bit(irq, &event_mask);
- return 0;
-}
-
static void shutdown_hypervisor_event(unsigned int irq)
{
clear_bit(irq, &event_mask);
+ clear_bit(irq, &HYPERVISOR_shared_info->events_mask);
}
static void enable_hypervisor_event(unsigned int irq)
{
set_bit(irq, &event_mask);
+ set_bit(irq, &HYPERVISOR_shared_info->events_mask);
+ if ( test_bit(EVENTS_MASTER_ENABLE_BIT,
+ &HYPERVISOR_shared_info->events_mask) )
+ do_hypervisor_callback(NULL);
}
static void disable_hypervisor_event(unsigned int irq)
{
clear_bit(irq, &event_mask);
+ clear_bit(irq, &HYPERVISOR_shared_info->events_mask);
}
static void ack_hypervisor_event(unsigned int irq)
printk("Unexpected hypervisor event %d\n", irq);
atomic_inc(&irq_err_count);
}
+ set_bit(irq, &HYPERVISOR_shared_info->events_mask);
+}
+
+static unsigned int startup_hypervisor_event(unsigned int irq)
+{
+ enable_hypervisor_event(irq);
+ return 0;
}
static void end_hypervisor_event(unsigned int irq)
#define set_mb(var, value) do { xchg(&var, value); } while (0)
#define set_wmb(var, value) do { var = value; wmb(); } while (0)
-/* interrupt control.. */
-#define __save_flags(x) ((x) = HYPERVISOR_shared_info->events_enable); barrier()
-#define __restore_flags(x) \
-do { \
- shared_info_t *_shared = HYPERVISOR_shared_info; \
- _shared->events_enable = (x); \
- barrier(); \
- if ( unlikely(_shared->events) && (x) ) do_hypervisor_callback(NULL); \
+
+#define __save_flags(x) \
+do { \
+ (x) = test_bit(EVENTS_MASTER_ENABLE_BIT, \
+ &HYPERVISOR_shared_info->events_mask); \
+ barrier(); \
+} while (0)
+
+#define __restore_flags(x) \
+do { \
+ shared_info_t *_shared = HYPERVISOR_shared_info; \
+ if (x) set_bit(EVENTS_MASTER_ENABLE_BIT, &_shared->events_mask); \
+ barrier(); \
+ if ( unlikely(_shared->events) && (x) ) do_hypervisor_callback(NULL); \
+} while (0)
+
+#define __cli() \
+do { \
+ clear_bit(EVENTS_MASTER_ENABLE_BIT, &HYPERVISOR_shared_info->events_mask);\
+ barrier(); \
} while (0)
-#define __cli() (HYPERVISOR_shared_info->events_enable = 0); barrier()
-#define __sti() \
-do { \
- shared_info_t *_shared = HYPERVISOR_shared_info; \
- _shared->events_enable = 1; \
- barrier(); \
- if ( unlikely(_shared->events) ) do_hypervisor_callback(NULL); \
+
+#define __sti() \
+do { \
+ shared_info_t *_shared = HYPERVISOR_shared_info; \
+ set_bit(EVENTS_MASTER_ENABLE_BIT, &_shared->events_mask); \
+ barrier(); \
+ if ( unlikely(_shared->events) ) do_hypervisor_callback(NULL); \
} while (0)
+
#define safe_halt() ((void)0)
#define __save_and_cli(x) do { __save_flags(x); __cli(); } while(0);
#define __save_and_sti(x) do { __save_flags(x); __sti(); } while(0);
-/* For spinlocks etc */
-//XXX#define local_irq_set(x) __save_and_sti(x)
-#define local_irq_save(x) ((x) = HYPERVISOR_shared_info->events_enable); (HYPERVISOR_shared_info->events_enable = 0); barrier()
+#define local_irq_save(x) \
+do { \
+ (x) = test_and_clear_bit(EVENTS_MASTER_ENABLE_BIT, \
+ &HYPERVISOR_shared_info->events_mask); \
+ barrier(); \
+} while (0)
#define local_irq_restore(x) __restore_flags(x)
#define local_irq_disable() __cli()
#define local_irq_enable() __sti()